home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Your Choice 3
/
Your Choice Software Collection 3.iso
/
prgmming
/
pbmodx10
/
vgatest.bas
< prev
next >
Wrap
BASIC Source File
|
1994-08-11
|
13KB
|
562 lines
' Demo of MODEX Library for PowerBASIC
' (c) Copyright 1994 by Dave Navarro, Jr.
' portions (c) Copyright 1992,93 by Matt Pritchard
' You may use this library for your own use, and commercial use without
' any fee requirements from the authors. However, you must include copyright
' information for the library in your source code comments "at the very least".
' This library uses 16 bit calls and requires a 286 machine or better for
' programs written with it.
' There is no documentation for this library at this time. Just print this
' source code file to see what we're doing.
$LINK "MODEX.PBL"
DEFINT A-Z
DECLARE SUB ERROR.OUT (Message$)
DECLARE FUNCTION GET.KEY% ()
DECLARE SUB PRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%, ColorB%)
DECLARE SUB TPRINT.TEXT (Text$, Xpos%, Ypos%, ColorF%)
TYPE ShapeType
ImgData AS STRING * 512
xWidth AS INTEGER
yWidth AS INTEGER
END TYPE
TYPE Sprite
Xpos AS INTEGER
Ypos AS INTEGER
XDir AS INTEGER
YDir AS INTEGER
Shape AS INTEGER
END TYPE
$INCLUDE "UTILS.INC"
$INCLUDE "MODEX.INC"
%MaxShapes = 32
DIM Img(32) AS SHARED ShapeType
INIT.RANDOM
LOAD.SHAPES
DEMO.RES %Mode320x200, 320, 200
DEMO.RES %Mode320x400, 320, 400
DEMO.RES %Mode360x200, 360, 200
DEMO.RES %Mode360x400, 360, 400
DEMO.RES %Mode320x240, 320, 240
DEMO.RES %Mode320x480, 320, 480
DEMO.RES %Mode360x240, 360, 240
DEMO.RES %Mode360x480, 360, 480
PAGE.DEMO
SET.VIDEO.MODE 3
END
SUB DEMO.RES (Mode, Xmax, Ymax)
IF SET.MODEX%(Mode) = 0 THEN
ERROR.OUT "Unable to SET.MODEX" + STR$(Mode)
END IF
XCenter = Xmax \ 2
X1 = 10
Y1 = 10
X2 = Xmax - 1
Y2 = Ymax - 1
FOR Z = 0 TO 3
Colr = 31 - Z * 2
DRAW.LINE X1 + Z, Y1 + Z, X2 - Z, Y1 + Z, Colr
DRAW.LINE X1 + Z, Y1 + Z, X1 + Z, Y2 - Z, Colr
DRAW.LINE X1 + Z, Y2 - Z, X2 - Z, Y2 - Z, Colr
DRAW.LINE X2 - Z, Y1 + Z, X2 - Z, Y2 - Z, Colr
NEXT Z
XChars = Xmax \ 10
YChars = Ymax \ 10
FOR X = 0 TO XChars - 1
TGPRINTC 48 + ((X + 1) MOD 10), X * 10 + 1, 1, 9 + ((X \ 8) MOD 7)
DRAW.LINE X * 10 + 9, 0, X * 10 + 9, 3, 15
NEXT X
FOR Y = 0 TO YChars - 1
TGPRINTC 48 + ((Y + 1) MOD 10), 1, Y * 10 + 1, 9 + ((Y \ 10) MOD 7)
DRAW.LINE 0, Y * 10 + 9, 3, Y * 10 + 9, 15
NEXT Y
' Draw Lines
FOR X = 0 TO 63
N = 15 + X * .75
SET.DAC.REGISTER 64 + X, N, N, N
SET.DAC.REGISTER 128 + X, 0, N, N
DRAW.LINE 103 - X, 60, 40 + X, 123, 64 + X
DRAW.LINE 40, 60 + X, 103, 123 - X, 128 + X
NEXT X
TPRINT.TEXT "LINE TEST", 37, 130, %c.BLUE
Y = 60: Gap = 0
FOR X = 0 TO 9
FILL.BLOCK 120, Y, 120 + X, Y + Gap, 64 + X
FILL.BLOCK 140 - (15 - X), Y, 150 + X, Y + Gap, 230 + X
FILL.BLOCK 170 - (15 - X), Y, 170, Y + Gap, 128 + X
Y = Y + Gap + 2
Gap = Gap + 1
NEXT X
TPRINT.TEXT "FILL TEST", 110, 46, %c.GREEN
FOR X = 190 TO 250 STEP 2
FOR Y = 60 TO 122 STEP 2
SET.POINT X, Y, X + Y + X + Y
NEXT Y
NEXT X
TPRINT.TEXT "PIXEL TEST", 182, 130, %c.RED
FOR X = 190 TO 250 STEP 2
FOR Y = 60 TO 122 STEP 2
IF READ.POINT(X, Y) <> ((X + Y + X + Y) AND 255) THEN
ERROR.OUT "READ.PIXEL Failure"
END IF
NEXT Y
NEXT X
Msg$ = " This is a MODE X demo "
PRINT.TEXT Msg$, XCenter - (LEN(Msg$) * 4), 20, %c.bRED, %c.BLUE
Msg$ = "Screen Resolution is by "
Xp = XCenter - (LEN(Msg$) * 4)
PRINT.TEXT Msg$, Xp, 30, %c.bGREEN, %c.BLACK
PRINT.TEXT LTRIM$(STR$(Xmax)), Xp + 8 * 21, 30, %c.bPURPLE, %c.BLACK
PRINT.TEXT LTRIM$(STR$(Ymax)), Xp + 8 * 28, 30, %c.bWHITE, %c.BLACK
FOR X = 0 TO 15
SET.DAC.REGISTER 230 + X, 63 - X * 4, 0, 15 + X * 3
DRAW.LINE 30 + X, Ymax - 6 - X, Xmax - 20 - X, Ymax - 6 - X, 230 + X
NEXT X
TPRINT.TEXT "Press <ANY KEY> to Continue", XCenter - (26 * 4), Ymax - 18, %c.YELLOW
X = GET.KEY%
IF X = %KyESC THEN ERROR.OUT "ABORT"
END SUB
SUB ERROR.OUT (Message$)
SET.VIDEO.MODE 3
PRINT Message$
END
END SUB
FUNCTION GET.KEY%
DO
X = SCAN.KEYBOARD
LOOP UNTIL X
GET.KEY% = X
END FUNCTION
SUB LOAD.SHAPES
DIM Grid(1 TO 32, 1 TO 32)
FOR Shape = 0 TO %MaxShapes - 1
FOR Y = 1 TO 32
FOR X = 1 TO 32
Grid(X, Y) = 0
NEXT X
NEXT Y
Style = RANDOM.INT(6)
Colour = 1 + RANDOM.INT(15)
SELECT CASE Style
CASE 0: ' Solid Box
DO
xWidth = 3 + RANDOM.INT(30)
yWidth = 3 + RANDOM.INT(30)
LOOP UNTIL ((xWidth * yWidth) <= 512)
FOR Y = 1 TO yWidth
FOR X = 1 TO xWidth
Grid(X, Y) = Colour
NEXT X
NEXT Y
CASE 1: ' Hollow Box
DO
xWidth = 5 + RANDOM.INT(28)
yWidth = 5 + RANDOM.INT(28)
LOOP UNTIL ((xWidth * yWidth) <= 512)
FOR Y = 1 TO yWidth
FOR X = 1 TO xWidth
Grid(X, Y) = Colour
NEXT X
NEXT Y
HollowX = 1 + RANDOM.INT(xWidth \ 2 - 1)
HollowY = 1 + RANDOM.INT(yWidth \ 2 - 1)
FOR Y = HollowY + 1 TO yWidth - HollowY
FOR X = HollowX + 1 TO xWidth - HollowX
Grid(X, Y) = nil
NEXT X
NEXT Y
CASE 2: ' Solid Diamond
xWidth = 3 + 2 * RANDOM.INT(10)
yWidth = xWidth
Centre = xWidth \ 2
FOR Y = 0 TO Centre
FOR X = 0 TO Y
Grid(Centre - X + 1, Y + 1) = Colour
Grid(Centre + X + 1, Y + 1) = Colour
Grid(Centre - X + 1, yWidth - Y) = Colour
Grid(Centre + X + 1, yWidth - Y) = Colour
NEXT X
NEXT Y
CASE 3: ' Hollow Diamond
xWidth = 3 + 2 * RANDOM.INT(10)
yWidth = xWidth
Centre = xWidth \ 2
sWidth = RANDOM.INT(Centre)
FOR Y = 0 TO Centre
FOR X = 0 TO Y
IF X + (Centre - Y) >= sWidth THEN
Grid(Centre - X + 1, Y + 1) = Colour
Grid(Centre + X + 1, Y + 1) = Colour
Grid(Centre - X + 1, yWidth - Y) = Colour
Grid(Centre + X + 1, yWidth - Y) = Colour
END IF
NEXT X
NEXT Y
CASE 4: ' Ball
xWidth = 7 + 2 * RANDOM.INT(8)
yWidth = xWidth
Centre = 1 + xWidth \ 2
FOR Y = 1 TO yWidth
FOR X = 1 TO xWidth
D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y)))
IF D < Centre THEN Grid(X, Y) = 150 + Colour * 2 + D * 3
NEXT X
NEXT Y
CASE 5: ' Ball
xWidth = 7 + 2 * RANDOM.INT(8)
yWidth = xWidth
Centre = 1 + xWidth \ 2
sWidth = RANDOM.INT(xWidth)
FOR Y = 1 TO yWidth
FOR X = 1 TO xWidth
D = SQR(((Centre - X) * (Centre - X)) + ((Centre - Y) * (Centre - Y)))
IF D < Centre AND D >= sWidth THEN Grid(X, Y) = 150 + Colour * 2 + D * 3
NEXT X
NEXT Y
END SELECT
Img(Shape).xWidth = xWidth
Img(Shape).yWidth = yWidth
A$ = STRING$(xWidth * yWidth, nil)
c = 1
FOR Y = 1 TO yWidth
FOR X = 1 TO xWidth
MID$(A$, c, 1) = CHR$(Grid(X, Y))
c = c + 1
NEXT X
NEXT Y
Img(Shape).ImgData = A$
NEXT Shape
END SUB
SUB PAGE.DEMO
%MaxSprites = 64
DIM Obj(%MaxSprites) AS Sprite
DIM LastX(%MaxSprites, 1), LastY(%MaxSprites, 1)
DIM LastObjects(1)
ScreenX = 360: ScreenY = 240
IF SET.VGA.MODEX%(%Mode320x200, ScreenX, ScreenY, 3) = 0 THEN
ERROR.OUT "Unable to SET.VGA.MODEX" + STR$(Mode)
END IF
SET.ACTIVE.PAGE 0
CLEAR.VGA.SCREEN %c.BLACK
PRINT.TEXT "This is a Test of the Following Functions:", 10, 9, %c.bWHITE, %c.BLACK
DRAW.LINE 10, 18, 350, 18, %c.YELLOW
PRINT.TEXT "SET.ACTIVE.PAGE", 10, 20, %c.bBLUE, %c.BLACK
PRINT.TEXT "SET.DISPLAY.PAGE", 10, 30, %c.GREEN, %c.BLACK
PRINT.TEXT "SET.DAC.REGISTER", 10, 40, %c.RED, %c.BLACK
PRINT.TEXT "CLEAR.VGA.SCREEN", 10, 50, %c.CYAN, %c.BLACK
PRINT.TEXT "TDRAW.BITMAP", 10, 60, %c.PURPLE, %c.BLACK
PRINT.TEXT "COPY.PAGE", 10, 70, %c.GREEN, %c.BLACK
PRINT.TEXT "COPY.BITMAP", 10, 80, %c.CYAN, %c.BLACK
PRINT.TEXT "GPRINTC", 10, 90, %c.BLUE, %c.BLACK
PRINT.TEXT "TGPRINTC", 10, 100, %c.GREEN, %c.BLACK
PRINT.TEXT "SET.WINDOW", 10, 110, %c.RED, %c.BLACK
PRINT.TEXT "VIRTUAL SCREEN SIZES", 190, 20, %c.bBLUE, %c.BLACK
PRINT.TEXT " SMOOTH SCROLLING", 190, 30, %c.GREEN, %c.BLACK
PRINT.TEXT " SPRITE ANIMATION", 190, 40, %c.CYAN, %c.BLACK
PRINT.TEXT " PAGE FLIPPING", 190, 50, %c.RED, %c.BLACK
PRINT.TEXT " COLOR CYCLING", 190, 60, %c.PURPLE, %c.BLACK
FOR X = 0 TO 60
SET.DAC.REGISTER 50 + X, 3 + X, 0, 60 - X
SET.DAC.REGISTER 150 + X, 3 + X, 0, 60 - X
NEXT X
c = 0: DC = 1
FOR X = 0 TO ScreenX \ 2
DRAW.LINE ScreenX \ 2 - 1, ScreenY \ 4, X, ScreenY - 1, c + 50
DRAW.LINE ScreenX \ 2, ScreenY \ 4, ScreenX - X - 1, ScreenY - 1, c + 50
c = c + DC
IF c = 0 OR c = 60 THEN DC = -DC
NEXT X
TPRINT.TEXT "Press <ANY KEY> to Continue", 72, 190, %c.bWHITE
TPRINT.TEXT "< > = Faster < > = Slower", 72, 204, %c.bGREEN
TPRINT.TEXT "< > = Fewer Shapes < > = More Shapes", 32, 218, %c.bCYAN
TGPRINTC 43, 80, 204, %c.YELLOW
TGPRINTC 45, 200, 204, %c.YELLOW
TGPRINTC 25, 40, 218, %c.YELLOW
TGPRINTC 24, 200, 218, %c.YELLOW
COPY.PAGE 0, 1
COPY.PAGE 0, 2
FOR X = 1 TO %MaxSprites
DO
Obj(X).XDir = RANDOM.INT(7) - 3
Obj(X).YDir = RANDOM.INT(7) - 3
LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
Obj(X).Shape = X MOD %MaxShapes
SpriteX = Img(Obj(X).Shape).xWidth
SpriteY = Img(Obj(X).Shape).yWidth
Obj(X).Xpos = 1 + RANDOM.INT(ScreenX - SpriteX - 2)
Obj(X).Ypos = 1 + RANDOM.INT(ScreenY - SpriteY - 2)
LastX(X, 0) = Obj(X).Xpos
LastX(X, 1) = Obj(X).Xpos
LastY(X, 0) = Obj(X).Ypos
LastY(X, 1) = Obj(X).Ypos
NEXT X
CurrentPage = 0
'View Shift...
ViewX = 0
ViewY = 0
ViewMax = 3
ViewCnt = 0
ViewXD = 1
ViewYD = 1
SetColor = 3: SDir = 1
PrevColor = 0: PDir = 1
VisObjects = %MaxSprites \ 2
LastObjects(0) = 0
LastObjects(1) = 0
DRAW.LOOP:
SET.ACTIVE.PAGE CurrentPage
' Erase Old Images
FOR X = 1 TO LastObjects(CurrentPage)
X1 = LastX(X, CurrentPage) AND &HFFFC
Y1 = LastY(X, CurrentPage)
X2 = ((LastX(X, CurrentPage) + Img(Obj(X).Shape).xWidth)) OR 3
Y2 = Y1 + Img(Obj(X).Shape).yWidth - 1
COPY.BITMAP 2, X1, Y1, X2, Y2, CurrentPage, X1, Y1
NEXT X
' Draw new images
FOR X = 1 TO VisObjects
SpriteX = Img(Obj(X).Shape).xWidth
SpriteY = Img(Obj(X).Shape).yWidth
' Move Sprite
REDOX:
NewX = Obj(X).Xpos + Obj(X).XDir
IF NewX < 0 OR NewX + SpriteX > ScreenX THEN
Obj(X).XDir = -Obj(X).XDir
IF RANDOM.INT(20) = 1 THEN
DO
Obj(X).XDir = RANDOM.INT(7) - 3
Obj(X).YDir = RANDOM.INT(7) - 3
LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
GOTO REDOX
END IF
END IF
Obj(X).Xpos = Obj(X).Xpos + Obj(X).XDir
REDOY:
NewY = Obj(X).Ypos + Obj(X).YDir
IF NewY < 0 OR NewY + SpriteY > ScreenY THEN
Obj(X).YDir = -Obj(X).YDir
IF RANDOM.INT(20) = 1 THEN
DO
Obj(X).XDir = RANDOM.INT(7) - 3
Obj(X).YDir = RANDOM.INT(7) - 3
LOOP WHILE (Obj(X).XDir = 0 AND Obj(X).YDir = 0)
GOTO REDOY
END IF
END IF
Obj(X).Ypos = Obj(X).Ypos + Obj(X).YDir
'Draw Sprite
TDRAW.BITMAP Img(Obj(X).Shape), Obj(X).Xpos, Obj(X).Ypos, SpriteX, SpriteY
LastX(X, CurrentPage) = Obj(X).Xpos
LastY(X, CurrentPage) = Obj(X).Ypos
NEXT X
LastObjects(CurrentPage) = VisObjects
' Pan Screen Back & Forth
ViewCnt = ViewCnt + 1
IF ViewCnt >= ViewMax THEN
ViewX = ViewX + ViewXD
IF ViewX = 0 OR ViewX = 39 THEN ViewXD = -ViewXD
IF ViewXD < 0 THEN
ViewY = ViewY + ViewYD
IF ViewY = 0 OR ViewY = 39 THEN ViewYD = -ViewYD
END IF
SET.WINDOW CurrentPage, ViewX, ViewY
ViewCnt = 0
ELSE
SET.DISPLAY.PAGE CurrentPage
END IF
' Cycle Colors
SET.DAC.REGISTER 50 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor
SET.DAC.REGISTER 50 + SetColor, SetColor, 10, 63 - SetColor
SET.DAC.REGISTER 150 + PrevColor, 3 + PrevColor, 0, 60 - PrevColor
SET.DAC.REGISTER 150 + SetColor, 63, 63, SetColor
SetColor = SetColor + SDir
IF SetColor = 60 OR SetColor = 0 THEN SDir = -SDir
PrevColor = PrevColor + PDir
IF PrevColor = 60 OR PrevColor = 0 THEN PDir = -PDir
CurrentPage = 1 - CurrentPage
Code = SCAN.KEYBOARD
IF Code = %False THEN GOTO DRAW.LOOP
IF Code = %KyPlus THEN
IF ViewMax < 12 THEN ViewMax = ViewMax + 1
GOTO DRAW.LOOP
END IF
IF Code = %KyMinus THEN
IF ViewMax > 1 THEN ViewMax = ViewMax - 1
IF ViewCnt >= ViewMax THEN ViewCnt = 0
GOTO DRAW.LOOP
END IF
IF Code = %KyUp THEN
IF VisObjects < %MaxSprites THEN VisObjects = VisObjects + 1
GOTO DRAW.LOOP
END IF
IF Code = %KyDown THEN
IF VisObjects > 1 THEN VisObjects = VisObjects - 1
GOTO DRAW.LOOP
END IF
END SUB
SUB PRINT.TEXT (Text$, Xpos, Ypos, ColorF, ColorB)
IF LEN(Text$) = 0 THEN EXIT SUB
PRINT.STR STRSEG(Text$), STRPTR(Text$), LEN(Text$), Xpos, Ypos, ColorF, ColorB
END SUB
SUB TPRINT.TEXT (Text$, Xpos, Ypos, ColorF)
IF LEN(Text$) = 0 THEN EXIT SUB
TPRINT.STR STRSEG(Text$), STRPTR(Text$), LEN(Text$), Xpos, Ypos, ColorF
END SUB